package com.practice.designMode.Iterator;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 在C 和 C++ 中，迭代器是一种指针，用于遍历容器中的元素。
 * 在Java 中，迭代器是一种接口，用于遍历容器中的元素。
 * 迭代器提供了一种统一的方式来遍历不同类型的容器，
 * 而不需要了解容器的内部结构。
 * 迭代器的主要作用是提供一种访问容器元素的方式，
 * 而不需要暴露容器的内部结构。
 * 迭代器的主要方法有：
 * hasNext()：判断是否还有下一个元素。
 * next()：返回下一个元素。
 * remove()：删除当前元素。
 * 迭代器的主要优点有：
 * 提供了一种统一的方式来遍历不同类型的容器。
 * 不需要了解容器的内部结构。
 * 迭代器的主要缺点有：
 * 迭代器的实现可能会比较复杂。
 * 迭代器的实现可能会比较慢。
 * 迭代器的实现可能会比较占用内存。
 */
public class IteratorTest {

    public static void main(String[] args) {
        List<TestObject> testObjectList = new ArrayList<TestObject>();
        testObjectList.add(new TestObject("Tom", 18));
        testObjectList.add(new TestObject("Jack", 20));
        testObjectList.add(new TestObject("Lucy", 20));
        testObjectList.add(new TestObject("Lily", 24));

        /**
         * 这一段会出现一个报错：java.util.ConcurrentModificationException
         * 这是因为在遍历过程中，我们对集合进行了修改，导致了迭代器的状态不一致。
         *  具体到代码层面，调用add方法时，modCount会加1，而expectedModCount不会改变。
         *  这个属性的含义是确定ArrayList的迭代器的版本，
         *  调用iterator时，expectedModCount会被赋值为modCount，
         *  调用next方法时，会判断expectedModCount是否等于modCount，
         */
        for (TestObject testObject : testObjectList) {
//            if(testObject.getAge() == 20) {
//                testObjectList.add(new TestObject("Rose", 22));
//            }
            System.out.println(testObject);
        }

        // 增强for循环，等同于下面的迭代器，它属于一个语法糖
        Iterator<TestObject> iterator = testObjectList.iterator();
        while (iterator.hasNext()) {
            TestObject testObject = iterator.next();
            if(testObject.getAge() == 20) {
                testObjectList.add(new TestObject("Rose", 22));
                break;
            }
            System.out.println(testObject);
        }

        // 通过为TestObject实现迭代器接口，并创建对应的迭代器，来遍历TestObject
        for(String name : new TestObject("Tom", 18)) {
            System.out.println(name);
        }
    }
}
